package com.sky.service.impl;

import com.sky.mapper.UserMapper;
import com.sky.service.UserReportService;
import com.sky.vo.UserReportVO;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class UserReportServiceImpl implements UserReportService {

    @Autowired
    private UserMapper userMapper;

    /**
     * 统计指定时间内的用户数量
     * @param begin 开始时间
     * @param end   结束时间
     * @return
     */
    @Override
    public UserReportVO userStatistics(LocalDate begin, LocalDate end) {
        // 存放从begin开始到end结束的日期
        List<LocalDate> dateList = new ArrayList<>();

        dateList.add(begin);
        while (!begin.equals(end)) {
            // 日期加1
            begin = begin.plusDays(1);
            dateList.add(begin);
        }

        // 存放当天总用户数量
        List<Integer> totalUserList = new ArrayList<>();
        // 存放当天新增用户数量
        List<Integer> newUserList = new ArrayList<>();

        // 遍历日期
        for (LocalDate date : dateList) {
            // 获取当天最早时间
            LocalDateTime beginTime = LocalDateTime.of(date, LocalTime.MIN);
            // 获取当天最晚时间
            LocalDateTime endTime = LocalDateTime.of(date, LocalTime.MAX);

            // 封装请求数据
            Map<String, Object> map = new HashMap<>();
            // 先存放当天最晚时间，便于SQL语句中使用，因为sql中包含开始时间和结束时间的判断
            map.put("endTime", endTime);
            // 统计截止到当天的总用户数量
            Integer totalUser = userMapper.getUserCount(map);

            // 封装请求数据
            map.put("beginTime", beginTime);
            // 统计当天的新增用户数量
            Integer newUser = userMapper.getUserCount(map);

            // 将数据存入相应的列表中
            totalUserList.add(totalUser); // 总用户
            newUserList.add(newUser);     // 新增用户
        }

        return UserReportVO
                .builder()
                .totalUserList(StringUtils.join(totalUserList,","))
                .newUserList(StringUtils.join(newUserList,","))
                .dateList(StringUtils.join(dateList,","))
                .build();
    }
}
